package com.itpeng.service.Impl;

import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itpeng.dao.SetMealDao;
import com.itpeng.entity.PageResult;
import com.itpeng.entity.QueryPageBean;
import com.itpeng.exception.HealthException;
import com.itpeng.pojo.Setmeal;
import com.itpeng.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @Aythor:彭彦钦
 * @Data: 2020/9/21  20:44
 */
@Service(interfaceClass = SetMealService.class)
public class SetMealServiceImpl implements SetMealService {
    @Autowired
    private SetMealDao setMealDao;

    /**
     * 分页条件查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult<Setmeal> findPage(QueryPageBean queryPageBean) {
        //该方法后的第一个查询语句将会执行分页查询
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());

        //判断是否存在查询条件时，有则执行模糊查询
        if (StringUtils.isNotEmpty(queryPageBean.getQueryString())){
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }

        //执行查询
        Page<Setmeal> setmeals = setMealDao.findPage(queryPageBean.getQueryString());

        //使用PageResult包装
        PageResult<Setmeal> setmealPageResult = new PageResult<Setmeal>(setmeals.getTotal(), setmeals.getResult());

        return setmealPageResult;
    }

    /**
     * 添加套餐，以及套餐和检查组的关系
     * @param setmeal
     * @param checkGroupIds
     */
    @Override
    @Transactional
    public void add(Setmeal setmeal, Integer[] checkGroupIds) {
        //添加新增的套餐
        setMealDao.add(setmeal);

        //判断是否添加成功，只要添加成功就会有ID号
        if (setmeal.getId() != null){
            //添加成功，则循环添加关系到表中
            for (Integer checkGroupId : checkGroupIds) {
                //添加套餐与检查组的关系
                setMealDao.addSetmealCheckGroup(setmeal.getId(), checkGroupId);
            }
        }

    }

    /**
     * 根据ID删除套餐
     * @param id
     */
    @Override
    public void deleteById(Integer id) throws HealthException {
        //先查询该套餐是否有被订单所引用
        int count = setMealDao.findOrderCountBySetmealId(id);

        //若有，则报异常
        if (count > 0) {
            throw new HealthException("套餐已被订单使用，无法删除！");
        }

        //若没有，则进行删除
        //先从关系表中将关系删除
        setMealDao.deleteSetmealCheckGroup(id);
        //再从主表中删除
        setMealDao.deleteById(id);

    }

    /**
     * 根据ID查找套餐
     * @param id
     * @return
     */
    @Override
    public Setmeal findById(Integer id) {
        return setMealDao.findById(id);
    }

    /**
     * 根据套餐ID查询对应的检查组
     * @param id
     * @return
     */
    @Override
    public List<Integer> findCheckgroupIdsBySetmealId(Integer id) {
        List<Integer> integerList = setMealDao.findCheckgroupIdsBySetmealId(id);

        return integerList;
    }

    /**
     * 修改套餐
     * @param setmeal
     * @param checkgroupIds
     */
    @Override
    public void update(Setmeal setmeal, Integer[] checkgroupIds) {
        //先修改主表的套餐
        setMealDao.update(setmeal);
        //先删除旧关系
        setMealDao.deleteSetmealCheckGroup(setmeal.getId());

        //若checkgroupIds不为空，则添加新关系,为空则不添加
        if (checkgroupIds != null){
            //不为空，则循环添加关系
            for (Integer checkgroupId : checkgroupIds) {
                setMealDao.addSetmealCheckGroup(setmeal.getId(), checkgroupId);
            }
        }

    }

    /**
     * 查询套餐中所有的图片
     * @return
     */
    @Override
    public List<String> findImgs() {
        return setMealDao.findImgs();
    }

    /**
     * 各个套餐的预约数量
     * @return
     */
    @Override
    public List<Map<String, Object>> getSetmealReport() {
        List<Map<String, Object>> dataMap = setMealDao.getSetmealReport();

        return dataMap;
    }
}
